package com.bruce.demo2.patterns.demo3.behavioral.demo13.template;

/**
 * @PROJECT_NAME: design_patterns
 * @DESCRIPTION: 抽象类（定义模板方法和基本方法）
 * @AUTHOR: CNBruceLee
 * @DATE: 2021/8/25 6:31
 */
public abstract class AbstractClass {

    /**
     * 油温
     */
    protected int oilTemp;

    public int getOilTemp() {
        return oilTemp;
    }

    public void setOilTemp(int oilTemp) {
        this.oilTemp = oilTemp;
    }

    /**
     * 模板方法 子类不能重新 用final修饰
     */
    public final void cookProcess() {
        pourOil();//1、倒油
        heatOil();//2、热油
        pourVegetable();//3、倒蔬菜
        pourSauce();//4、到调料
        fry();//5、翻炒
    }

    /**
     * 1、倒入油（公用方法，直接实现）
     */
    public void pourOil() {
        System.out.println("倒油");
    }

    /**
     * 2、热油（公用方法，直接实现）
     */
    public void heatOil() {
        while (!isSuitableTemp()) {
            System.out.println("热油中，油温：" + getOilTemp());
            setOilTemp(getOilTemp() + 10);
        }
    }

    /**
     * 3、倒蔬菜是不一样的（一个是包菜，一个是下菜心）
     */
    public abstract void pourVegetable();

    /**
     * 4、到调味料是不一样的
     */
    public abstract void pourSauce();

    /**
     * 5、翻炒是一样的，所以直接实现
     */
    public void fry() {
        System.out.println("炒啊炒啊炒到熟啊");
    }

    /**
     * 钩子方法 判断油温是否达标
     *
     * @return
     */
    protected abstract boolean isSuitableTemp();

}
